/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package myAI;

import tablut.IJoueur;

/**
 * Notre chevalier saint triomphera !!!
 * @author root
 *
 */
public class HolyKnight implements IJoueur
{

        /**
         * Algo utilisé dans le jeu
         */
        private IAlgo mAlgo = null;

        private final short TAILLE = 9;

        // what is my colour?
        private int maCouleur;
        private int couleurEnnemi;

        // board
        private Plateau mPlateau = null;

        /**
         * Détermination du prochain coup à jouer
         */
        public String choixMouvement()
        {
                try
                {

                        System.out.println("Ah, c'est a moi, le joueur HolyKnight " + maCouleur + " de jouer... Je réfléchis...");
                        System.out.println("Voici mon plateau de jeu avant de choisir mon coup :");
                        this.printPlateau();

                        // Détermination du prochain coup
                         Coup prochainCoup = this.mAlgo.meilleurCoup(this.mPlateau, maCouleur);

                        // Avant de le renvoyer, on le joue...
                        prochainCoup.couleur = this.maCouleur;
                        this.mPlateau.jouerCoup(prochainCoup, false);

                        String msg = "" + prochainCoup.departLigne + " " + prochainCoup.departColonne + " " + prochainCoup.arriveeLigne + " " + prochainCoup.arriveeColonne + '\0';
                        System.out.println("Voici mon mouvement : " + msg);
                        System.out.println("Voici mon plateau de jeu apres mon coup :");
                        this.printPlateau();
                        if(this.mPlateau.estFinal())
                        {
                                System.out.println("Ce plateau est final !");
                        }

                        return msg;

                } catch (Exception e) {

                        e.printStackTrace();

                        return "Erreur >_<";
                }
        }

        public static int joueurSuivant(int couleur)
        {
                if(couleur == NOIR)
                {
                        return BLANC;
                }
                else if(couleur == BLANC)
                {
                        return NOIR;
                }

                System.out.println("Couleur invalide : " + couleur);

                return -1;
        }

        public void declareLeVainqueur(int colour)
        {
                if(colour == maCouleur)
                {
                        if(maCouleur == NOIR)
                        {
                                System.out.println("The holly knight has fallen XD");
                        }
                        else
                        {
                                System.out.println("Ouh yeah yeah ! XD");
                        }
                }
                else
                {
                        if(maCouleur == BLANC)
                        {
                                System.out.println("The holly knight has fallen >_<");
                        }
                        else
                        {
                                System.out.println("huhu! >_<");
                        }
                }

        }

        // On suppose ici que le mouvement est bien légal.
        public void mouvementEnnemi(int startRow, int startCol, int finishRow, int finishCol) {
                System.out.println("On vient de me dire que Ennemi avait joué.");

                Coup coup = new Coup();
                coup.departLigne        = (short) startRow;
                coup.departColonne      = (short) startCol;
                coup.arriveeLigne       = (short) finishRow;
                coup.arriveeColonne = (short) finishCol;
                coup.couleur            = couleurEnnemi;

                this.mPlateau.jouerCoup(coup, false);

                System.out.println("Voici mon plateau de jeu apres le coup de ennemi:");
                this.printPlateau();
                if(this.mPlateau.estFinal())
                {
                        System.out.println("Ce plateau est final !");
                }

        }

        /**
         * Affiche le plateau courant
         *
         */
        private void printPlateau(){
                System.out.println(this.mPlateau.toString());
        }

        public String quadriName()
        {
                return "HolyKnight : Stéphane Dautroy - Anne-Sophie Luyperts - Aurélien Fontich - Julien Roger";
        }

        public void initJoueur(int mycolour) {
                maCouleur = mycolour;
                if (mycolour == BLANC)
                {
                        couleurEnnemi = NOIR;
                }
                else
                {
                        couleurEnnemi = BLANC;
                }

                this.mPlateau = new Plateau(TAILLE);
                this.mPlateau.initPlateau();

                IHeuristique heuristique;
                if(this.maCouleur == BLANC)
                {
                        heuristique = new HeuristiqueBlanc();
                }
                else
                {
                        heuristique = new HeuristiqueNoir();
                }

                this.mAlgo = new AlgoNegAlphaBeta(heuristique);
        }

        /**
         * Ctor
         *
         */
        public HolyKnight()
        {

        }

}

